package guard.finder;

import guard.finder.objetos.ubicacion;
import guard.finder.utils.conexionWS;
import guard.finder.utils.utils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Overlay;

public class check_in extends Activity {    
	
	final utils util = new utils();	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.check_in);
        Bundle bundle = getIntent().getExtras();
        //Obtener el nombre del usuario que inicio sesion.
        final String usuario= bundle.getString("usuario");
        final Button btnMakeCheckIn = (Button)findViewById(R.id.btnMakeCheck);
        final int zoomInic = 18;
        final GeoPoint locActual = new GeoPoint(10.361056,-84.509606);
        final conexionWS servicio = new conexionWS();
        MapView mOsmv;
        MapController mOsmvController;
        mOsmv = (MapView)findViewById(R.id.map);
        //Permitir que pueda hacer zoom en el mapa.
        mOsmv.setBuiltInZoomControls(true);
        mOsmv.setMultiTouchControls(true);
        mOsmvController = mOsmv.getController();
        mOsmvController.setZoom(zoomInic);
        mOsmvController.setCenter(locActual);
        comenzarLocalizacion(mOsmv, mOsmvController);
        
        //Evento OnClick para registrar el check-in.
        btnMakeCheckIn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				//Llamar a la funcion check in para que se conecte con el WS y registre el check-in.
				ArrayList<ubicacion> ubicaciones = servicio.obtenerUbicacion(locActual.getLatitudeE6()/1E6,locActual.getLongitudeE6()/1E6);
				if(ubicaciones.isEmpty()){
					util.mostrarMSG(check_in.this, "No se ha podido comunicar con el Web Service");
				}
				else{
					ArrayList<String> listaUbicaciones = new ArrayList<String>();
					for(Iterator<ubicacion> u = ubicaciones.iterator(); u.hasNext();){
						ubicacion ub = u.next();
						listaUbicaciones.add(ub.getUbicacion());
					}
					ubicacion u = ubicaciones.get(0);
					if(u.getId()==-1){
						util.mostrarMSG(check_in.this, u.getUbicacion());
					}
					else{
						final CharSequence[] listaAux = listaUbicaciones.toArray(new CharSequence[listaUbicaciones.size()]); 
						final ArrayList<ubicacion> listUbic = new ArrayList<ubicacion>(ubicaciones);
						AlertDialog.Builder builder = new AlertDialog.Builder(check_in.this);
						builder.setTitle("Seleccione la ubicacion:");
						builder.setSingleChoiceItems(listaAux, -1, new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int item) {
								dialog.dismiss();
								ubicacion u = listUbic.get(item);								
								String resultado = servicio.checkIn(usuario, u.getId());
								if("true".equals(resultado)){
									util.mostrarMSG(check_in.this, "Su ubicacion se ha registrado.");
								}
								else util.mostrarMSG(check_in.this, resultado);								
						    }
						});
						AlertDialog alert = builder.create();
						alert.closeOptionsMenu();
						alert.show();
					}
				}
			}
		});        
    }
    
    /**
     * Funcion para empezar a utilizar el GPS y determinar nuestra ubicacion.
     * Esta posicion es asignada en una variable de Localizacion.
     */
    private void comenzarLocalizacion(final MapView mOsmv, final MapController mOsmvController)
    {
    	//Obtenemos una referencia al LocationManager
    	LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    	//Obtenemos la ultima posicion conocida
    	Location loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    	//Mostramos la ultima posicion conocida
    	mostrarPosicion(loc,mOsmv, mOsmvController);
    	//Nos registramos para recibir actualizaciones de la posicion
    	LocationListener locListener = new LocationListener() {
	    	public void onLocationChanged(Location location) {
	    		mostrarPosicion(location, mOsmv, mOsmvController);
	    	}
	    	public void onProviderDisabled(String provider){
//	    		util.mostrarMSG(check_in.this, "Provider Off");	    		
	    	}
	    	public void onProviderEnabled(String provider){
//	    		util.mostrarMSG(check_in.this, "Provider On");
	    	}
	    	public void onStatusChanged(String provider, int status, Bundle extras){
//	    		util.mostrarMSG(check_in.this, "Provider Status: "+ status);
	    	}
    	};
    	//Solicitud para hacer actualizaciones cada 15segundos.
    	locManager.requestLocationUpdates(
    			LocationManager.GPS_PROVIDER, 15000, 0, locListener);
    }
    
    /**
     * Funcion para mostrar la ubicacion aproximada, basada en una localizacion.
     * @param loc Ubicacion del dispositivo.
     * @param mOsmv Una vista que muestra un mapa de OSM.
     * @param mOsmvController Para controlar la panoramica y el zoom del mapa.
     */
    private void mostrarPosicion(Location loc, MapView mOsmv, MapController mOsmvController) {
    	if(loc != null)
    	{
    		GeoPoint locActual = new GeoPoint(loc.getLatitude(), loc.getLongitude());
    		//Centrar en el mapa nuestra posicion.
    		mOsmvController.setCenter(locActual);
    		//Definir una capa para marcar nuestra ubicacion en el mapa.
    		List<Overlay> capas = mOsmv.getOverlays();
    		//Limpiar las capas que obtenemos. 
    		capas.clear();
    		OverlayMapa om = new OverlayMapa(check_in.this);
    		//Asignar latitud y longitud al punto a marcar en el mapa.
    		om.setLatitud(Double.parseDouble(locActual.getLatitudeE6()+""));
    		om.setLongitud(Double.parseDouble(locActual.getLongitudeE6()+""));
    		//Agregar el punto a la capa.
    		capas.add(om);
    		mOsmv.postInvalidate();
    	}
    	else util.mostrarMSG(check_in.this, "No se ha podido ubicar la posicion!");
    }
}